#!/bin/bash

JAVA=$(which java)

if [ -z "$JAVA" ]; then
    echo "Cannot find a Java JDK. Please put java(>=1.8) in your PATH" 2>&2
fi

# 【注意】：jmx 端口号; gc 日志路径;

# 1. jvisualvm 监控【远程】Java 进程。
#   监控方式有两种：一种是 jvm 提供的 jmx，一种是 jdk 包已经包含的一个单独的程序 jstatd。
#   jmx 方式：要使用 jmx 远程监控功能，在远程 Java 应用启动时，必须通过 jvm 选项配置系统属性提供远程服务。
#     -Dcom.sun.management.jmxremote，相当于 -Dcom.sun.management.jmxremote=true，表示开启 jmx。
#     -Djava.rmi.server.hostname，jmx 默认通过 localhost 的 ip 地址提供 RMI（Remeto Method Invocation）服务，可以显式指定。
#     -Dcom.sun.management.jmxremote.port=8777，提供远程服务的端口
#     -Dcom.sun.management.jmxremote.rmi.port=8777，指定本地 jmx client 提供服务的端口与远程服务端口相同。
#     jmx 远程服务默认是开启 ssl 和 认证功能的，可以通过 jvm 选项进行关闭：
#             -Dcom.sun.management.jmxremote.authenticate=false
#             -Dcom.sun.management.jmxremote.ssl=false
# 2. 打印 gc 日志
#   打印基本 GC 信息
#     -XX:+PrintGCDetails
#     -XX:+PrintGCDateStamps
#   打印对象年龄分布：分析 GC 时的晋升情况和晋升导致的高暂停
#     -XX:+PrintTenuringDistribution
#   GC 后打印堆数据：每次发生 GC 时，对比一下 GC 前后的堆内存情况
#     -XX:+PrintHeapAtGC
#   GC日志输出的文件路径：使用-%t作为日志文件名（每次启动用时间戳命名日志文件）
#     -Xloggc:/path/to/gc-%t.log
#   开启日志文件分割
#     -XX:+UseGCLogFileRotation
#   最多分割几个文件，超过之后从头开始写
#     -XX:NumberOfGCLogFiles=15
#   每个文件上限大小，超过就触发分割
#     -XX:GCLogFileSize=100M
nohup $JAVA
  -Djava.rmi.server.hostname=192.168.73.102
  -Dcom.sun.management.jmxremote=true
  -Dcom.sun.management.jmxremote.port=8777
  -Dcom.sun.management.jmxremote.rmi.port=8777
  -Dcom.sun.management.jmxremote.authenticate=false
  -Dcom.sun.management.jmxremote.ssl=false
  -XX:+PrintGCDetails
  -XX:+PrintGCDateStamps
  -XX:+PrintTenuringDistribution
  -XX:+PrintHeapAtGC
  -Xloggc:/usr/local/src/TAmaster/sh/gclog/gc-%t.log
  -XX:+UseGCLogFileRotation
  -XX:NumberOfGCLogFiles=15
  -XX:GCLogFileSize=100M
  -XX:+HeapDumpOnOutOfMemoryError
  -Xmx256m -Xms256m
  -jar xxx.jar>xxx.out 2>&1 &
